<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        //预解析
        /* 问1
        console.log(num);
        问2
        console.log(num1);//坑 1 undefined
        var num1=10;
        问3
        fn();
        function fn(){
            console.log(111);
        }
        问4
        fun();//会报错 坑2
        var fun=function(){
            console.log(222);
        } */
        // 1.js运行代码分为两步：预解析  执行代码
        // （1）预解析会把js里面的所有var和function提升到当前作用域的最前面
        // （2）执行代码 按照书写顺序执行
        // 2.预解析分为 变量预解析（变量提升）和函数预解析（函数提升）
        // （1）变量提升就是将所有的变量声明提升到到当前的作用域最前面 不提升赋值操作
        // (2)函数提升就是将函数的声明提升到当前作用域的最前面 所以3问可以执行
        /*  console.log(num1); //坑 1 undefined
         var num1 = 10;
         //相当于执行了
         var num1;
         console.log(num1); //所以会出现undefined这个结果
         num1 = 10;
         fun(); //会报错 坑2
         var fun = function() {
                 console.log(222);
             }
             //相当于执行了
         var fun;
         fun();
         fun = function() {
                 console.log(222);
             } */
        //--------------------------------------------------------------------------------------------------------------------
        //对象：生活中的万事万物都可以称为对象，对象是一个具体的实物---是一组无序的相关方法和属性的集合
        // 属性：事物的特征  常用名词
        // 方法：事物的行为  常用动词
        //在JavaScript中有三种创建对象的方法
        //  1.利用字面量来创建
        var obj = {
            uname: "张三疯",
            sex: "男",
            height: 170,
            weight: 120,
            sayhi: function() {
                console.log("你好啊");
            }
        }
        console.log(obj.sex);
        // console.log();
        let {
            uname
        } = obj
        console.log(uname);
        obj.sayhi();
        /*  （1） 里面的属性采用：键值对的方式： 属性名：属性值
            （2） 每个属性或方法用，隔开
            （3）方法冒号后面跟的是一个匿名函数 */
        /*   1》使用对象用对象名.属性名
          2》对象名['属性名']//必须加上引号
          3》调用方法：对象名.方法名   obj.sayhi()//需要加上（），函数必须加上（） */

        // 2.利用new Object创建对象
        /* var Obj = new Object();
        Obj.name = '张三疯';
        Obj.sex = 'female';
        Obj.height = 180;
        Obj.Sayhi = function() {
                console.log('hi~');
            } */
        // 利用等号和赋值添加对象的属性和方法，用；号隔开
        // 3.利用构造函数来创建对象（构造函数的函数名第一个字要大写 ）
        //前两种方式创建对象只能创建一个对象
        // 我们一次创建一个对象，很多的代码是相同的，因此我们可以用创建函数的方法，将重复的代码封装起来
        //因为这个函数不是封装函数，而是封装对象
        // 构造函数就是将我们对象里面一些相同的属性和方法抽象出来封装到函数里面
        // 构造函数的格式
        /*   function 构造函数名(参数){
              this.属性名;
              this.方法名=function(){}
          }
          new 构造函数名(参数); */
        function Star(name, sex) {
            this.name = name;
            this.sex = sex;
            this.sing = function() {
                console.log('甜蜜蜜');
            }
        }
        var LDH = new Star('刘德华', '男');
        console.log(LDH.sex);
        LDH.sing(); //调用方法函数时要加上（）
        console.log(LDH['name']);
        //构造函数函数名首字母要大写，不用写return就能返回值
        //#遍历对象（使用for...in遍历）
        /*  格式
         for（变量 in 对象）{} */
        for (var k in LDH) {
            console.log(k); //输出变量的话，会是里面的属性名
            console.log(LDH[k]); //输出的是属性的值，一定要加上[]格式要记住，一般不用来遍历方法
        }
        //自定义对象，即我们创建的对象
        //内置对象：指js自带的一些对象
        // JavaScript中给我们提供了多个内置对象：Math，Date，Array，String等，可以直接拿来用
    </script>
</head>

<body>

</body>

</html>